package com.soul.utils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class IdUtil {

    public static String md5(String plainText) {
        String reMd5 = "";
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(plainText.getBytes());
            byte[] btArr = md.digest();
            int i;
            StringBuilder sb = new StringBuilder("");
            for (int offset = 0; offset < btArr.length; offset++) {
                i = btArr[offset];
                if (i < 0)
                    i += 256;
                if (i < 16)
                    sb.append("0");
                sb.append(Integer.toHexString(i));
            }

            reMd5 = sb.toString();

        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return reMd5;
    }

    /**
     * 身份证15位转18位
     * @param id 身份证
     */
    public static String getIdCardMd52(String id) {
        if (null != id && id.length() != 0) {
            if (id.length() == 15) {
                // 转换15位身份证为18位
                // 前六位表示地址码,精确到县
                // 6到12位表示出生日期,格式为yyMMdd格式
                // 最后3位顺序码,表示同一地区内的顺序号,顺序码的奇数分配给男性,偶数分配给女性
                StringBuilder sb = new StringBuilder();
                //补全年份, 19**年为15位(2000年以前), 获得17位号码
                sb.append(id.substring(0, 6)).append("19").append(id.substring(6));

                char[] sbCharArr = sb.toString().toCharArray();
                //加权因子
                int[] weightFactor = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
                //校验码数组
                char[] verifyCode = {'1', '0', 'x', '9', '8', '7', '6', '5', '4', '3', '2'};
                char[] verifyCodeBase = {'0'};
                int weight = 0;
                int verifyCodeIdx;
                for (int i = 0; i < weightFactor.length; i++) {
                    //修改后的17位号码每一位按照下面的加权因子的数字集合的顺序分别相乘后求和
                    weight += (sbCharArr[i] - verifyCodeBase[0]) * weightFactor[i];
                }
                //计算校验位下标
                verifyCodeIdx = weight % 11;
                //获取校验位
                sb.append(verifyCode[verifyCodeIdx]);
                id = sb.toString();
            }
            return md5(id.toLowerCase());
        }
        return "";
    }

}
